﻿using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Controls;

using SimbaRGVMonitor.Models;

namespace SimbaRGVMonitor.Views.Components
{
    partial class VertexItem : UserControl, IRectable
    {
        public VertexItem()
        {
            InitializeComponent();
            InitializeSettings();
        }

        //====================================================================================================
        //以上是类型构造函数
        //----------------------------------------------------------------------------------------------------
        //以下是类型字段
        //====================================================================================================

        private Vertex vertex;
        private Brush ellipseBrush = Brushes.LimeGreen;

        //====================================================================================================
        //以上是类型字段
        //----------------------------------------------------------------------------------------------------
        //以下是类型属性
        //====================================================================================================

        public Point Location
        {
            get;
            private set;
        }

        public bool IsOccupied
        {
            get { return vertex.IsOccupied; }
        }

        public string VertexNo
        {
            get { return vertex == null ? string.Empty : vertex.VertexNo; }
        }

        public string ArriveRobotNo
        {
            get { return vertex == null ? string.Empty : vertex.ArrivedRobot; }
        }

        //====================================================================================================
        //以上是类型属性
        //----------------------------------------------------------------------------------------------------
        //以下是初始化设置
        //====================================================================================================

        private void InitializeSettings()
        {
            Canvas.SetZIndex(this, 1);

            containerGrid.MouseEnter += WhenMouseEnter;
            containerGrid.MouseLeave += WhenMouseLeave;
        }

        //====================================================================================================
        //以上是初始化设置
        //----------------------------------------------------------------------------------------------------
        //以下是重置站点对象
        //====================================================================================================

        internal void ResetVertex(Vertex vertex, Point location)
        {
            this.vertex = vertex;
            pointNameTextBlock.Text = vertex.VertexNo;
            ellipse.Fill = vertex.IsOccupied ? Brushes.OrangeRed : ellipseBrush;

            Location = location;
            this.SetCanvasLocation(Location);
        }

        //====================================================================================================
        //以上是重置站点对象
        //----------------------------------------------------------------------------------------------------
        //以下是获取中心点
        //====================================================================================================

        internal bool TryGetActualCenter(out Point center)
        {
            if(this.HasActualHeight() == false)
            {
                center = new Point();
                return false;
            }

            var x = Math.Round(Location.X + Width / 2, 2);
            var y = Math.Round(Location.Y + ellipse.ActualHeight / 2, 2);
            center = new Point(x, y);
            return true;
        }

        //====================================================================================================
        //以上是获取中心点
        //----------------------------------------------------------------------------------------------------
        //以下是鼠标事件侦听
        //====================================================================================================

        private void WhenMouseLeave(object sender, MouseEventArgs e)
        {
            ellipse.Fill = ellipseBrush;
        }

        private void WhenMouseEnter(object sender, MouseEventArgs e)
        {
            ellipseBrush = ellipse.Fill;
            ellipse.Fill = Brushes.BlueViolet;
        }

        //====================================================================================================
        //以上是鼠标事件侦听
        //----------------------------------------------------------------------------------------------------
        //以下是实现IRectable接口
        //====================================================================================================

        Rect IRectable.GetBounds()
        {
            Rect rect;
            this.TryGetActualBounds(Location, out rect);
            return rect;
        }
    }
}
